import {RouteRecordRaw} from "vue-router";
import type {ModulesType, ModuleType, DealRouter} from "@/types/utils/routerCollecter"
import {hasPermission} from "@/utils/permission.ts";

// 收集所有模块
export function collectModules(modules: ModulesType) {
    const _modules: Array<{
        [index: string]: RouteRecordRaw
    }> = [];
    Object.keys(modules).forEach(key => {
        const module = modules[key].default;
        _modules.push(module);
    });
    return _modules;
}

// 对象形式的路由收集者
export function collectRouterByObject(_modules: ModuleType, path: string = '', array: Array<DealRouter> = []) {
    let routerArray= array;
    // 获取相应的项
    _modules.forEach(item => {
        for (let routeKey in item) {
            const ofModule = item[routeKey] as {
                [index: string]: any
            };
            // 路由全路径
            const routePath: string = ofModule.name? ofModule.name : ofModule.path;
            // 判断是否为重定向的项
            if(ofModule.hasOwnProperty("component")) {
                let obj: DealRouter = {
                    name: path + routePath,
                    path: ofModule.path
                }
                if(ofModule.hasOwnProperty("meta")) obj.meta = ofModule.meta;
                if(ofModule.hasOwnProperty("redirect")) obj.redirect = ofModule.redirect;
                if(!(ofModule.hasOwnProperty("redirect") && ofModule.hasOwnProperty("children")))
                    routerArray.push(obj);
            }
            // 判断是否存在children， 此时应用了引用类型所以不需要合并数组
            if(ofModule.hasOwnProperty("children")) collectRouterByArray(ofModule.children, path + ofModule.path + "/", routerArray);
        }
    });

    return routerArray;
}

// 数组形式的路由收集者
export function collectRouterByArray (_modules: Array<RouteRecordRaw>, path: string = '', array: Array<DealRouter> = []) {
    let routerArray= array;
    _modules.forEach(router => {
        // 路由全路径
        const routePath: string | symbol = router.name? router.name : router.path;
        // 判断是否为重定向的项
        if(router.hasOwnProperty("component")) {
            let obj: DealRouter = {
                name: routePath.toString(),
                path: path + router.path
            }
            if(router.hasOwnProperty("meta")) obj.meta = router.meta;
            // if(router.hasOwnProperty("redirect")) obj.redirect = router.redirect;
            if(!(router.hasOwnProperty("redirect") && router.hasOwnProperty("children")))
                routerArray.push(obj);
        }
        if(router.hasOwnProperty("children")) collectRouterByArray(router.children as Array<RouteRecordRaw>, path + router.path + "/", routerArray);
    })

    return routerArray;
}

// 收集tabbar
export function collectTabbar(routes: DealRouter[]) {
    const tabbar: Array<DealRouter> = [];
    routes.forEach(inspectRouter => {
        let canAdd: boolean = false;
        // 是否为tabbar
        if(inspectRouter.meta && inspectRouter.meta.isTabbar) {
            // 是否存在roles权限
            if(inspectRouter.meta.hasOwnProperty("roles"))
                canAdd = hasPermission(inspectRouter.meta.roles);
            // 没有权限设置时默认为加入到tabbar中
            else canAdd = true;
        }
        // 可以加入tabbar时直接添加进入tabber
        if(canAdd) tabbar.push(inspectRouter);
    })

    return tabbar;
}
